#!/bin/sh

export SERVER_NAME=${pkg.mainClass}

#跳转到工作目录
PWDPATH="$(cd `dirname $0`; pwd)"
cd $PWDPATH/..
CLSPATH=$(pwd)

#===========================================================================================
# Java Environment Setting
#===========================================================================================

export JAVA="java"
#拼凑完整的classpath参数，包括指定lib目录下所有的jar
CLASS_PATH=$CLSPATH/classes
for i in $CLSPATH/lib/*.jar; do
  CLASS_PATH="$CLASS_PATH":"$i"
done

#===========================================================================================
# JVM Configuration
#===========================================================================================
JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g  -Xss256k -XX:+DisableExplicitGC -XX:+AggressiveOpts"
JAVA_OPT="${JAVA_OPT} -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods"
JAVA_OPT="${JAVA_OPT} -XX:+UseG1GC -XX:MaxGCPauseMillis=80 -XX:+PrintGCDetails"
JAVA_OPT="${JAVA_OPT} -XX:InitiatingHeapOccupancyPercent=70 -XX:NewRatio=2 -XX:SurvivorRatio=6 "
JAVA_OPT="${JAVA_OPT} -XX:MaxTenuringThreshold=15 "
JAVA_OPT="${JAVA_OPT} -XX:G1ReservePercent=10 "
#设置垃圾收集器在并行阶段使用的线程数,默认值随JVM运行的平台不同而不同
#JAVA_OPT="${JAVA_OPT} --XX:ParallelGCThreads=16 "
#并发垃圾收集器使用的线程数量. 默认值随JVM运行的平台不同而不同
#JAVA_OPT="${JAVA_OPT} --XX:ConcGCThreads=16 "
#使用G1时Java堆会被分为大小统一的的区(region)。此参数可以指定每个heap区的大小. 默认值将根据 heap size 算出最优解. 最小值为 1Mb, 最大值为 32Mb
JAVA_OPT="${JAVA_OPT} -XX:G1HeapRegionSize=3M "
JAVA_OPT="${JAVA_OPT} -verbose:gc -XX:+PrintGCDateStamps -Xloggc:${CLSPATH}/log/gc.log"
JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow"

if [ ! -d "${CLSPATH}/log" ]; then
  mkdir ${CLSPATH}/log
fi

#################记录启动操作日志#############################

LOG_FILE=$CLSPATH/bin/logs/boot.log
if [ ! -d "$CLSPATH/bin/logs" ]; then
  mkdir $CLSPATH/bin/logs
fi
if [ ! -f "$LOG_FILE" ]; then
  touch $LOG_FILE
fi

function logTime() {
  #当前时间
  Time=$(date "+%Y-%m-%d %H:%M:%S")

  if [ -n "$1" ]; then
    echo "$Time $1" >>$LOG_FILE
  else
    echo " " >>$LOG_FILE
  fi
}

#################记录启动操作日志#############################

#检测pid
function getPid() {
  echo "检测状态---------------------------------------------"
  pid=$(ps -ef | grep -n ${SERVER_NAME} | grep -v grep | awk '{print $2}')
  if [ ${pid} ]; then
    echo "运行pid：${pid}"
    logTime "检测状态 运行pid：${pid}"
  else
    echo "未运行"
    logTime "检测状态 未运行"
  fi
}

#启动程序
function start() {
  #查询是否有启动进程
  getPid
  if [ ${pid} ]; then
    echo "已启动,请先停止后再次尝试启动"
    logTime "已启动，请先停止后再次尝试启动"
  else
    echo "启动程序---------------------------------------------"
    JAVA_CMD="nohup $JAVA $JAVA_OPT -cp $CLASS_PATH $SERVER_NAME >/dev/null 2>&1 &"
    #echo $JAVA_CMD
    eval $JAVA_CMD
    logTime "执行启动  $JAVA_CMD"
    #查询是否有启动进程
    getPid
  fi
}

#停止程序
function stop() {
  getPid
  if [ ${pid} ]; then
    echo "停止程序---------------------------------------------"
    kill -9 ${pid}
    logTime "停止 kill -9 ${pid}"
    getPid
    if [ ${pid} ]; then
      echo "停止失败"
    else
      echo "停止成功"
    fi
  fi
}

logTime "执行启动"

#启动时带参数，根据参数执行
if [ ${#} -ge 1 ]; then
  case ${1} in
  "start")
    start
    ;;
  "restart")
    start
    ;;
  "stop")
    stop
    ;;
  "status")
    getPid
    ;;
  *)
    echo "${1}无任何操作"
    ;;
  esac
else
  echo "
    command如下命令：
    start：启动
    stop：停止进程
    restart：重启
    status：状态
    示例命令如：./operator.sh start
    "
fi
logTime "执行完成"
logTime
